package com.example.exampleproject.utils;

import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class SexEnumHandler  extends BaseTypeHandler<SexEnum> {

    /**
     * 用于定义设置参数时，该如何把Java类型的参数转换为对应的数据库类型(即插入时设置参数类型)
     * @param preparedStatement SQL预编译对象
     * @param i 需要赋值的索引位置(相当于在JDBC中对占位符的位置进行赋值)
     * @param sexEnum 索引位置i需要赋的值(原本要给这个位置赋的值，在setNonNullParameter方法中主要解决的问题就是将这个自定义类型变成数据库认识的类型)
     * @param jdbcType jdbc的类型
     */
    @Override
    public void setNonNullParameter(PreparedStatement preparedStatement, int i, SexEnum sexEnum, JdbcType jdbcType) throws SQLException {
        preparedStatement.setString(i,sexEnum.getValue());
    }

    /**
     *用于定义通过字段名称获取字段数据时，如何把数据库类型转换为对应的Java类型(获取时转换回的自定义类型)
     * @param resultSet 结果集
     * @param columnName 列名
     */
    @Override
    public SexEnum getNullableResult(ResultSet resultSet, String columnName) throws SQLException {
        String value = resultSet.getString(columnName);
        return  resultSet.wasNull()? null: SexEnum.getSexEnumByValue(value);
    }

    /**
     * 用于定义通过字段索引获取字段数据时，如何把数据库类型转换为对应的Java类型
     * @param resultSet 结果集
     * @param columnIndex 列索引
     */
    @Override
    public SexEnum getNullableResult(ResultSet resultSet, int columnIndex) throws SQLException {
        String value = resultSet.getString(columnIndex);
        return  resultSet.wasNull()? null: SexEnum.getSexEnumByValue(value);
    }

    /**
     * 用定义调用存储过程后，如何把数据库类型转换为对应的Java类型(根据存储过程获取)
     * @param callableStatement 结果集
     * @param columnIndex 列索引
     */
    @Override
    public SexEnum getNullableResult(CallableStatement callableStatement, int columnIndex) throws SQLException {
        String value = callableStatement.getString(columnIndex);
        return  callableStatement.wasNull()? null: SexEnum.getSexEnumByValue(value);
    }
}
